package cn.bugstack.xfg.dev.tech.domain.event;

import cn.bugstack.xfg.dev.tech.types.BaseEvent;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Value;

import java.util.Date;

/**
 * 用户推送实践消息的聚合
 */
public class UserMessageEvent extends BaseEvent<UserMessageEvent.UserMessage> {

    @Value("${kafka.topic.user}")
    private String topic;

    @Override
    public EventMessage<UserMessage> buildEventMessage(UserMessage data) {
        return EventMessage.<UserMessage>builder()
                .id(RandomStringUtils.randomNumeric(11))
                .timestamp(new Date())
                .data(data)
                .build();
    }

    @Override
    public String topic() {
        return topic;
    }

    /**
     * 要推送的事件消息，聚合到当前类下。
     */
    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class UserMessage {
        private String userId;
        private String userName;
        private String userType;
    }

}

/*
这个文件 UserMessageEvent.java 位于 xfg-dev-tech-domain 模块下，主要作用如下：

1. 作用定位
- 该类是一个具体的事件实现，继承自 BaseEvent<UserMessage>，用于描述"用户消息推送"这一领域事件。
- 主要用于事件驱动架构中，封装和传递与用户相关的消息推送事件。

2. 主要内容讲解
- 通过 @Value("${kafka.topic.user}") 注解，topic 字段可从配置文件动态注入 Kafka 的 topic 名称。
- 重写 buildEventMessage(UserMessage data) 方法，生成带有唯一 id、时间戳和数据体的事件消息。
- 重写 topic() 方法，返回当前事件对应的 topic 名称。
- 内部静态类 UserMessage 封装了用户消息的具体内容，包括 userId、userName、userType。
- 使用 Lombok 注解自动生成 getter/setter、构造方法和 builder，简化代码。

3. 使用场景
- 当系统需要推送与用户相关的消息时，可以通过 UserMessageEvent 封装事件数据，并发送到 Kafka 等消息中间件。
- 该事件类保证了事件结构的统一和可扩展性，便于后续维护和拓展。

4. 总结
- UserMessageEvent 是领域层的具体事件实现，结合了配置注入、事件封装和消息推送的能力。
- 通过继承 BaseEvent，实现了事件的标准化和复用。
*/
